#include"stm32f4xx.h"
#include"misc.h"
#include"kernel.h"
#include"mutex.h"

void GPIOA_Init(){
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
    GPIO_InitTypeDef GPIO_A;
    GPIO_A.GPIO_Mode=GPIO_Mode_OUT;
    GPIO_A.GPIO_OType=GPIO_OType_OD;
    GPIO_A.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8; 
    GPIO_Init(GPIOA,&GPIO_A);
    GPIO_SetBits(GPIOA,GPIO_Pin_6);
    GPIO_SetBits(GPIOA,GPIO_Pin_7);
    GPIO_SetBits(GPIOA,GPIO_Pin_8);

    GPIO_A.GPIO_Mode=GPIO_Mode_IN;
    GPIO_A.GPIO_OType=GPIO_OType_OD;
    GPIO_A.GPIO_Pin=GPIO_Pin_4;
    GPIO_A.GPIO_PuPd=GPIO_PuPd_UP;
    GPIO_Init(GPIOE,&GPIO_A); 
}

void Task1(){
    while(1){
        GPIO_ResetBits(GPIOA,GPIO_Pin_6);
        for(int i=0;i<10000000;++i){
            __ASM("NOP\r\n");
        }
        GPIO_SetBits(GPIOA,GPIO_Pin_6);
        for(int i=0;i<10000000;++i){
            __ASM("NOP\r\n");
        }
    }
}

void Task2(){
    while(1){
        GPIO_ResetBits(GPIOA,GPIO_Pin_7);
        for(int i=0;i<1000000;++i){
            __ASM("NOP\r\n");
        }
        GPIO_SetBits(GPIOA,GPIO_Pin_7);
        for(int i=0;i<1000000;++i){
            __ASM("NOP\r\n");
        }
    }
}

void Task3(){
    char f=0;
    while(1){
        if(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)){
            f=!f;
            while(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4));
        }
        if(f){
            GPIO_ResetBits(GPIOA,GPIO_Pin_8);
        }else{
            GPIO_SetBits(GPIOA,GPIO_Pin_8);
        }
    }
}

int main(void){
    GPIOA_Init();
    kernel_init();
    kernel_thread_create(Task2,0);
    kernel_thread_create(Task1,0);
    //kernel_thread_create(Task3,0);
    kernel_start();
    while(1);
}
